import re
import tkinter as tk
from tkinter import messagebox

# 初始化Tkinter窗口
root = tk.Tk()

# 设置窗口大小和位置
root.geometry('300x270+400+100')
# 不允许改变窗口大小
root.resizable(False, False)
# 设置窗口标题
root.title('简易计算器')

# 放置用来显示信息的文本框，并设置为只读
content_var = tk.StringVar()
content_entry = tk.Entry(root, textvariable=content_var, state='readonly')
content_entry.place(x=10, y=10, width=280, height=20)

# 定义运算符
operators = ('+', '-', '*', '/', '**', '//')

# 按钮通用代码，参数btn表示点击的是哪个按钮
def button_click(btn):
    content = content_var.get()
    
    # 如果已有内容是以小数点开头的，前面加0
    if content.startswith('.'):
        content = '0' + content
    
    # 根据不同按钮做出相应的处理
    if btn in '0123456789':
        content += btn
    elif btn == '.':
        # 如果最后一个运算数中已经有小数点，就提示错误
        last_part = re.split(r'[+\-*/.]', content)[-1]
        if '.' in last_part:
            messagebox.showerror('错误', '小数点太多了')
            return
        else:
            content += btn
    elif btn == 'C':
        # 清除整个表达式
        content = ''
    elif btn == 'sqrt':
        try:
            # 尝试计算平方根，注意这里只处理最后一个数字部分
            last_number = re.findall(r'\d+\.\d+|\d+', content)[-1]
            content = str(eval(f'sqrt({last_number})')) + content[content.rfind(last_number) + len(last_number):]
            # 由于我们替换了部分内容，需要重新计算整个表达式（这里简化处理，只替换最后结果）
            # 注意：这种方法有局限性，比如不能直接处理连续运算的情况
            # 更完善的做法应该是使用解析器或更复杂的逻辑来处理表达式
        except:
            messagebox.showerror('错误', '无法计算平方根')
            return
    elif btn == '=':
        try:
            # 对输入的表达式求值（注意：这里直接使用eval有安全风险，实际应用中应避免）
            content = str(eval(content.replace('**', '**').replace('//', '//')))  # 替换掉可能由于复制粘贴导致的错误字符
        except:
            messagebox.showerror('错误', '表达式错误')
            return
    elif btn in operators:
        if content.endswith(operators):
            messagebox.showerror('错误', '不允许存在连续运算符')
            return
        content += btn
    
    content_var.set(content)

# 放置清除按钮和等号按钮
btn_clear = tk.Button(root, text='Clear', command=lambda: button_click('C'))
btn_clear.place(x=40, y=40, width=80, height=20)
btn_compute = tk.Button(root, text='=', command=lambda: button_click('='))
btn_compute.place(x=170, y=40, width=80, height=20)

# 放置10个数字、小数点和计算平方根的按钮
digits = list('0123456789.') + ['sqrt']
index = 0
for row in range(4):
    for col in range(3):
        d = digits[index]
        index += 1
        btn_digit = tk.Button(root, text=d, command=lambda x=d: button_click(x))
        btn_digit.place(x=20 + col * 70, y=80 + row * 50, width=50, height=20)

# 放置运算符按钮
for index, operator in enumerate(operators):
    btn_operator = tk.Button(root, text=operator, command=lambda x=operator: button_click(x))
    btn_operator.place(x=230, y=80 + index * 30, width=50, height=20)

# 进入Tkinter主循环
root.mainloop()